// TODO: 这里写一些通用纯函数(只依赖外部参数,不依赖外部环境)


/**
 * 处理str字符串,返回将limit字数后的字符去除的新字符串,根据ellipsis决定是否在末尾加入...
 * @param {String} str - 原文本
 * @param {Number} limit - 限制字数
 * @param {Boolean} [ellipsis=true] - 是否在后面补充...
 * @return {String} - 处理后的字符串
 */
function strLimit(str, limit, ellipsis) {
	let _str = str.substring(0, limit)
	ellipsis = ellipsis == undefined ? true : ellipsis
	return str.length <= limit ? str : _str + (ellipsis ? '...' : '')
}

/**
 * 将时间按format中缩写的格式输出字符串
 * @param {String|Number|Date} [time=Date.now] - 时间戳或时间格式字符串或Date对象
 * @param {String} [format='yyyy-MM-dd hh:mm:ss'] - 格式 y-年, M-月, d-日, h-时, m-分, s-秒, S-毫秒, q-季节
 * @return {String} - 按format格式输出的字符串
 */
function timeFormat(time, format = 'yyyy-MM-dd hh:mm:ss') {
	time = time || Date.now()
	let t = new Date(time)
	let o = {
		"M+": t.getMonth() + 1, //month
		"d+": t.getDate(), //day
		"h+": t.getHours(), //hour
		"m+": t.getMinutes(), //minute
		"s+": t.getSeconds(), //second
		"q+": Math.floor((t.getMonth() + 3) / 3), //quarter
		"S": t.getMilliseconds() //millisecond
	}
	if (/(y+)/.test(format)) format = format.replace(RegExp.$1,
		(t.getFullYear() + "").substr(4 - RegExp.$1.length))
	for (let k in o)
		if (new RegExp("(" + k + ")").test(format))
			format = format.replace(RegExp.$1,
				RegExp.$1.length == 1 ? o[k] :
				("00" + o[k]).substr(("" + o[k]).length))
	return format
}

/**
 * 判断两个时间是否同一天(即是否年月日相同)
 * 第二个时间默认取当前时间,只传第一个参数可理解为判断传入时间是否当天
 * @param {String|Number|Date} t1 - 需判断的时间1,时间戳或时间格式字符串或Date对象
 * @param {String|Number|Date} [t2=Date.now] - 需判断的时间2,默认取当前时间,时间戳或时间格式字符串或Date对象
 * @return {Boolean} - t1 t2 是否同一天
 */
function isSameDay(t1, t2) {
	t2 = t2 || Date.now()
	let _t1 = new Date(t1).setHours(0, 0, 0, 0)
	let _t2 = new Date(t2).setHours(0, 0, 0, 0)
	return _t1 == _t2
}


/****************************     我是分割线     ***********************************
 * 下面是针对该项目写的工具方法,通用性较上面降一级
 ****************************     我是分割线     ***********************************/
import Vue from 'vue'
 
/**
 * 获取链接上某个变量的值（抄自epub项目）
 * @param {String} name - 变量的key
 * @return {String} - key对应的value
 */
function getUrlParam(name) {
	return getv(name)
	// var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); // 构造一个含有目标参数的正则表达式对象
	// var r = window.location.search.substr(1).match(reg); // 匹配目标参数
	// if (r != null) return unescape(r[2]);
	// return null; // 返回参数值
}

// 将天姬的getv搬过来
function getv(name, mrz, source) {
	var shref = '';
	if (!window) return mrz
	 shref = (window.location + "").replace(/;amp;/g, '&');
	
	shref = source || shref.replace(/&amp;/gi, '&');
	if (shref.indexOf('#') > 0) {
		var shrefa = shref.split('#');
		if (shrefa[1].indexOf('=') == -1) shref = shrefa[0];
		if (shref.indexOf('#rd') > 0) shref = shref.replace(/#rd/g, "&");
	}
	var reg = new RegExp("(^|\\?|&)" + name + "=([^&]*)(\\s|&|$)", "i");
	var ifurlval=0;
	var ress = ''
	if (reg.test(shref)){ress=RegExp.$2;if(ress!=""&&ress!="null"&&ress!='undefined') {ifurlval=1;mrz = RegExp.$2;} }
	
	//var pathname=location.pathname;
	//if(name=='idc' || name=='eg')pathname=location.pathname.match(/^\/[^\/]+$/g)[0].substring(1);
	if((mrz+'').indexOf('%')>-1) mrz = decodeURI(mrz);
	return mrz;

}

/**
 * @method getUrl
 * @description 添加或者替换URL参数，有修改无添加
 * @param  {[type]} refername 参数名
 * @param  {[type]} v         值
 * @param  {[type]} source    源地址
 * @return {[type]}           修改后的URL地址
 * @example
 * var shlink=j().getUrl('tidus',db.idus,lurl);
 */
function getUrl(refername, v, source) {
	// if (!window) return source
	var shref = ''
	shref = (window && window.location) + '';
	//if($('divmain'))if(jQuery('#divmain').attr('surl')!='')shref=jQuery('#divmain').attr('surl');
	if (source) shref = source.split('#')[0];
	if (refername.indexOf("||") > 0) {
		refernamea = refername.split("||");
		shref = refernamea[0];
		refername = refernamea[1];
	}
	let myArray = refername.split(",");
	let vArray = (v + '').split(",");
	if (myArray.length == 1) {
		vArray[0] = v
	}
	myArray.forEach(function(n, i) {
		var bc = shref.indexOf(n + "=");
		if (bc > 0) {
			let band = shref.indexOf("&", bc);
			shref = shref.substring(0, bc) + n + "=" + vArray[i] + (band > 0 ? shref.substring(band, shref.length) : "");
		} else {
			var jh = '';
			if (shref.indexOf('#') > -1) {
				var shrefa = shref.split('#');
				shref = shrefa[0];
				jh = '#' + shrefa[1];
			}
			shref += (shref.indexOf("?") > -1 ? "&" : "?") + n + "=" + vArray[i] + jh;
		}
	});
	return shref;
}


/**
 * 针对web页面,判断是否微信环境
 */
function isWechat() {
	if (!window) return true
	var ua = window.navigator.userAgent.toLowerCase();
	if (ua.match(/MicroMessenger/i) == 'micromessenger') {
		return true;
	} else {
		return false;
	}
}

/**
 * 针对浏览器，判断是否ios系统
 */
function isIOS() {
	return !!navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/)
}

// 因为需要多次调用，简单封装跳转填表单页
// function gotoPack(goodsId) {
// 	uni.navigateTo({
// 		url: `/pages/pack/pack?goodsId=${goodsId}`
// 	})
// }

// 将天姬的db.getrd搬过来
function _getrd(n) {
	let rad = '',
		sj = 13
	for (let i = 0; i < n; i++) {
		if (i == 0) {
			sj = Math.floor(Math.random() * 104) % 52
		} else {
			sj = Math.floor(Math.random() * 124) % 62
		}
		rad += 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'.substring(sj, sj + 1)
	}
	return rad
}

// 将天姬的T.aid搬过来
function _aid() {
	return _getrd(6) + Date.now()
}

// 将天姬的fungetaid搬过来
function fungetaid(aid, func) {
	// if (aid) jg_aj.idus = "" //服务器指定新aid 
	(getcookie('aid') || '').includes('%') && setcookie('aid', decodeURIComponent(getcookie(
		'aid') || ''))
	aid = aid || getcookie('aid') || _aid()
	
	aid = getv('aid', aid) //url上指定的,是测试临时用的，不写入cookie
	
	setcookie('aid', aid)
	if (func) func(aid)
	return aid
}

// 将天姬的jex().cookie.set搬过来
function setcookie(name, value) {
	let ttl = 1e3 * 3600 * 24 * 365;
	document.cookie = name + "=;path=/;expires=Thu, 01-Jan-1970 00:00:01 GMT";
	var expires = new Date;
	expires.setTime(expires.getTime() + ttl);
	document.cookie = [name + "=" + value + "; ", "expires=" + expires.toGMTString() + "; ", "path=/"].join("");
}

// 将天姬的jex().cookie.get搬过来
function getcookie(name) {
	var cookie = document.cookie.split("; ")
	for (var i in cookie) {
		if (typeof(cookie[i]) == 'string') {
			var spl = cookie[i].split("=")
			if (spl.length == 2 && spl[0] == name) {
				return spl[1]
			}
		}
	}
	return undefined;
}

// 获取aid（默认总店aid，便于在HBuilder中测试）
function getAid() {
	return getUrlParam('aid') || getcookie('aid') || 'yHFF2F1582868828401'
}

// 判断手机号类型（将天姬的j().IsMobileNum搬过来）
// 返回值为0，则不是手机格式
// 返回值为1，则是移动手机号码
// 返回值为2，则是联通手机号码
// 返回值为3，则是电信手机号码
function isMobileNum(text) {
	text = typeof(text)=="number" ? text+"" : typeof(text)=="string" ? text : ""
	let _emp = /^\s*|\s*$/g
	text = text.replace(_emp, "")
	let _d = /^1(3[3])|(8[019])\d{8}$/
	let _l = /^1(3[0-2]|5[56]|8[56]|4[5]|7[6]|6[6])\d{8}$/
	let _y = /^1(3[4-9]|5[012789]|8[23478]|4[7]|7[8])\d{8}$/
	if (_d.test(text)) {
		return 3
	} else if (_l.test(text)) {
		return 2
	} else if(_y.test(text)) {
		return 1
	}
	if (text.length == 11) {
	   //加入判断 
		if (text.indexOf("153")==0 || text.indexOf("177")==0) return 3
	}
	return 0
}

// 判断是否QQ号
function isQQ(text) {
	return /[1-9][0-9]{4,}/.test(text)
}

// 根据scene值判断能否使用关注公众号功能
function canUseOfficialAccount(scene) {
	return [1047, 1124, 1089, 1038].includes(scene)
}

// 将带jpn({...})的字符串解析为json
function jpn2json(jpnStr) {
	let s = jpnStr || '{}', res = {}
	try {
		s = s.replace(/\s/g, '')
		s = s.substring(4, s.length-1)
		s = s.replace(/ /g, '')
			.replace(/'/g, '"')
			.replace(/\)/, '')
			.replace(/[\{,]{1}[a-zA-Z_0-9]\w*[:]{1}/g, function (v) {
				return v[0] + '"' + v.substring(1, v.length-1) + '"' + v[v.length-1]
			})
		res = JSON.parse(s)
	} catch (err) {
		console.log('jpn2json 出错了，jpnStr，err：', jpnStr, s, err)
		res = {}
	}
	return res
}

export default {
	strLimit,
	timeFormat,
	isSameDay,
	

	isWechat,
	isIOS,
	// gotoPack,

	getUrlParam,
	getv,
	getUrl,
	fungetaid,
	setcookie,
	getcookie,
	getAid,
	isMobileNum,
	isQQ,
	
	canUseOfficialAccount,
	jpn2json
}
